// /**
//  * 原理：
//  * 1.通过getImageData获取到所有的像素，考虑到浏览器的性能问题，可是间隔一定的像素取点
//  * 2.通过透明度是否大于128来判断是否有颜色，把符合条件的点的坐标保存到预设的数组dots中
//  * 3.动画：
//  *  a.通过初始坐标和目的坐标算出全程运动的加速度vx，vy.
//  *  b.通过运动公式算出每一帧的坐标变化
//  *  c.判断当前坐标是否和目的坐标重合，如果是则粒子运动停止
//  * @return {[type]}          [description]
//  */
// // 定义粒子化对象的引用
// var particle;
// var tools = require('../js/utils.js');
// var Particle = function(selector) {
//   this.aniopt = {};
//   this.canvas = document.querySelector(selector);
//   particle = this;
// };


// /**
//  * 动画
//  *model:0是分散，1是聚合
//  */
// Particle.prototype.animate = function(options) {
//   particle.aniopt.time = options.time || 10;
//   particle.aniopt.pertime = options.pertime || 0.3;
//   particle.aniopt.radius = options.radius || 1;
//   particle.aniopt.space = options.space || 1;
//   particle.aniopt.model = options.model; //model:0是分散，1是聚合
//   particle.aniopt.shape = options.shape || "square";
//   particle.aniopt.disappear = options.disappear;
//   initAnimate(getDots());
// };


// function initAnimate(dots) {
//   var model = particle.aniopt.model;
//   console.log(dots.length);
//   dots.map(function(dot) {
//     //初始化粒子
//     if (model === 1) {
//       dot.x2 = Math.random() * particle.canvas.width;
//       dot.y2 = Math.random() * particle.canvas.height;
//     } else if (model === 0) {
//       dot.x2 = dot.x1;
//       dot.y2 = dot.y1;
//       dot.x1 = Math.random() * particle.canvas.width;
//       dot.y1 = Math.random() * particle.canvas.height;
//     } else {
//       return;
//     }
//     dot.paint();
//   });
//   animate(dots);

// }

// function animate(dots
// ) {
//   var model = particle.aniopt.model;
//   var context = particle.canvas.getContext('2d');
//   var t = particle.aniopt.time; //总的运动时间
//   var t1 = particle.aniopt.pertime; //每帧的时间间隔
//   context.clearRect(0, 0, particle.canvas.width, particle.canvas.height);
//   dots.map(function(dot) {
//     if (model == 1) {
//       dot.vx = (dot.x1 - dot.x2) / t;
//       dot.vy = (dot.y1 - dot.y2) / t;
//       //这里需要控制每个点的停止和运动
//       if (dot.pause === true) {
//         dot.x2 = dot.x1;
//         dot.y2 = dot.y1;
//       }
//       dot.x2 += dot.vx * t1;
//       dot.y2 += dot.vy * t1;
//       if (Math.abs(dot.x1 - dot.x2) < 0.01 && Math.abs(dot.y1 - dot.y2) < 0.01) {
//         dot.pause = true;
//       }
//     } else if (model == 0) {
//       dot.vx = (dot.x1 - dot.x2) / t;
//       dot.vy = (dot.y1 - dot.y2) / t;
//       //这里需要控制每个点的停止和运动
//       if (dot.pause === true) {
//         dot.x2 = dot.x1;
//         dot.y2 = dot.y1;
//       }
//       dot.x2 -= dot.vx * t1;
//       dot.y2 -= dot.vy * t1;
//       if (Math.abs(dot.x1 - dot.x2) < 100 && Math.abs(dot.y1 - dot.y2) < 100 && particle.aniopt.disappear) {
//         dot.pause = true;
//       }
//     }

//     dot.paint();

//   })
//   requestAnimationFrame(function() {
//     animate(dots);
//   })

// }



// var Dot = function(x1, y1, x2, y2, vx, vy) {
//   this.x1 = x1; //目标坐标
//   this.y1 = y1;
//   this.x2 = x2; //初始坐标
//   this.y2 = y2;
//   this.vx = vx; //加速度
//   this.vy = vy;
//   this.radius = particle.aniopt.radius;
// }
// module.exports = Particle;

(function(global, factory) {
  if (typeof define === 'function' && define.amd) {
    define(function() {
      return factory(global, global.document);
    });
  } else if (typeof module !== 'undefined' && module.exports) {
    module.exports = factory(global, global.document);
  } else {
    global.Dot = factory(global, global.document);
  }
}(typeof window !== 'undefined' ? window : this, function(window, document) {

  'use strict';
  /**
   * x1:初始位置的X坐标
   * y1:初始位置的Y坐标
   * dw:粒子的宽
   * dh:粒子的高
   * r,g,b,a:rgba颜色中对应的值
   * @type {Object}
   */
  var defaultOps = {
    x1: 0,
    y1: 0,
    r: 0,
    g: 0,
    b: 0,
    a: 1,
    paint: {
      shape: 'square',
      dw: 1,
      dh: 1,
      radius: 1,
    },
  };
  var Dot = function(options) {
    if (typeof options == "object") {
      Object.keys(options).map(function(key) {
        defaultOps[key] = options[key];
      });
    }
  };
  Dot.prototype.paint = function(options) {
    var opts = defaultOps.paint;
    if (typeof options == "object") {
      Object.keys(options).map(function(key) {
        opts[key] = options[key];
      });
    }
    var shape = opts.shape;
    var ctx = defaultOps.context;
    if (ctx) {
      ctx.beginPath();
      ctx.fillStyle = "rgba(" + this.r + "," + this.g + "," + this.b + "," + this.a + ")";
      if (shape == "square") {
        ctx.fillRect(this.x1, this.y1, opts.dw, opts.dh);
      } else if (shape == "circle") {
        ctx.arc(this.x1, this.y1, opts.radius, 0, Math.PI * 2, false);
      }
      ctx.fill();
    }
  };

  return Dot;
}));
